﻿#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
//实现二叉树(采用二插链的结构:每个结点中保存一个值，以及两个指针，分别指向该结点的左、右孩子)

typedef int DataType;
//定义二叉树结点的结构
typedef struct BinaryTreeNode
{
	DataType data;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}BTNode;


//前序(先序)遍历:采用递归的方式
void PreOrder(BTNode* root);//传根结点结构的地址

//中序遍历:采用递归的方式
void InOrder(BTNode* root);//传根结点结构的地址

//后序遍历:采用递归的方式
void PostOrder(BTNode* root);//传根结点结构的地址

//计算二叉树结点的个数
int BinaryTreeSize(BTNode* root);//传根结点结构的地址

//计算二叉树叶子结点的个数
int BinaryTreeLeafSize(BTNode* root);//传根结点结构的地址

//计算⼆叉树第k层结点个数
int BinaryTreeLevelKSize(BTNode* root, int k);//传根结点结构的地址

//计算⼆叉树的深度/⾼度
int BinaryTreeDepth(BTNode* root);//传根结点结构的地址


//查找存储值为x的结点，并返回该结点(结构)的地址
BTNode* BinaryTreeFind(BTNode* root, DataType x);//传根结点结构的地址

//二叉树的销毁(先销毁左子树，再销毁右子树，最后销毁根结点)
void BinaryTreeDestory(BTNode** root);//因为根结点(结构)销毁的同时，根结点结构的地址也要赋值为NULL，因此这里传的是指向根结点结构的地址的指针

